<!DOCTYPE html>
<html lang="zh-cn">
  <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    
    <title>调试 Node.js | liuz2&#39;s Blog</title>
    <meta name="viewport" content="width=device-width,minimum-scale=1">
    <meta name="generator" content="Hugo 0.63.1" />
    
    
      <META NAME="ROBOTS" CONTENT="NOINDEX, NOFOLLOW">
    

    
    
      <link href="/dist/css/app.9576afd3b3c158d98f48ec5df01fec6a.css" rel="stylesheet">
    

    

    
      

    

    

    <meta property="og:title" content="调试 Node.js" />
<meta property="og:description" content="如何启动 Node.js 检查器？如何连接 Node.js 进程？常用的调试器客户端有哪些？" />
<meta property="og:type" content="article" />
<meta property="og:url" content="https://liuz2.gitee.io/posts/debug-nodejs/" />
<meta property="article:published_time" content="2020-08-12T11:13:30+08:00" />
<meta property="article:modified_time" content="2020-08-12T11:13:30+08:00" />
<meta itemprop="name" content="调试 Node.js">
<meta itemprop="description" content="如何启动 Node.js 检查器？如何连接 Node.js 进程？常用的调试器客户端有哪些？">
<meta itemprop="datePublished" content="2020-08-12T11:13:30&#43;08:00" />
<meta itemprop="dateModified" content="2020-08-12T11:13:30&#43;08:00" />
<meta itemprop="wordCount" content="121">



<meta itemprop="keywords" content="node," /><meta name="twitter:card" content="summary"/>
<meta name="twitter:title" content="调试 Node.js"/>
<meta name="twitter:description" content="如何启动 Node.js 检查器？如何连接 Node.js 进程？常用的调试器客户端有哪些？"/>

	
  </head>

  <body class="ma0 avenir bg-white">

    
   
  

  <header>
    <div class="bg-black">
      <nav class="pv3 ph3 ph4-ns" role="navigation">
  <div class="flex-l justify-between items-center center">
    <a href="/" class="f3 fw2 hover-white no-underline white-90 dib">
      
        liuz2&#39;s Blog
      
    </a>
    <div class="flex-l items-center">
      

      
        <ul class="pl0 mr3">
          
          <li class="list f5 f4-ns fw4 dib pr3">
            <a class="hover-white no-underline white-90" href="/about/" title="About page">
              About
            </a>
          </li>
          
          <li class="list f5 f4-ns fw4 dib pr3">
            <a class="hover-white no-underline white-90" href="/links/" title="Links page">
              Links
            </a>
          </li>
          
          <li class="list f5 f4-ns fw4 dib pr3">
            <a class="hover-white no-underline white-90" href="/timeline/" title="Timeline page">
              Timeline
            </a>
          </li>
          
        </ul>
      
      















    </div>
  </div>
</nav>

    </div>
  </header>



    <main class="pb7" role="main">
      
  
  <article class="flex-l flex-wrap justify-between mw8 center ph3">
    <header class="mt4 w-100">
      <h1 class="f3 athelas mt3 mb1">调试 Node.js</h1>
      
      
      <time class="f6 mv1 dib tracked" datetime="2020-08-12T11:13:30&#43;08:00">August 12, 2020</time>

      
      
    </header>
    <div class="nested-copy-line-height lh-copy sans-serif f5 nested-links nested-img mid-gray pr4-l w-two-thirds-l"><blockquote>
<p>本文摘录自 Node.js 官网的文档 <a href="https://nodejs.org/en/docs/guides/debugging-getting-started/" title="Debugging Guide">Debugging Guide</a></p>
</blockquote>
<h2 id="启动检查器">启动检查器</h2>
<p>启用 <code>--inspect</code> 开关后，Node.js 进程会监听调试客户端（debugging client）。默认情况下，它监听的主机和端口是 <code>127.0.0.1:9229</code>。每个进程拥有唯一的 <a href="https://tools.ietf.org/html/rfc4122" title="A Universally Unique IDentifier (UUID) URN Namespace">UUID</a> 标识符。</p>
<p>调试客户端连接时，必须明确指定主机，端口号和 UUID。完整的 URL 样例如下：</p>
<pre><code>ws://127.0.0.1:9229/0f2c936f-b1cd-4ac9-aab3-f63b0f33d55e
</code></pre><p>当 Node.js 接收到 <code>SIGUSR1</code> 信号（Windows 没有 <code>SIGSUR1</code>），也会开始监听调试信息。在 Node.js 7 和更早版本，这会激活遗留的调试 API。在 Node.js 8 和更新版本，这将激活 Inspector API。</p>
<h2 id="安全隐患">安全隐患</h2>
<p>因为调试器能完全操纵 Node.js 的执行环境，恶意用户连接端口后，能代表 Node.js 进程执行任意代码。Node.js 调试器端口暴露到公网或私网带来的安全隐患，务必谨记于心。</p>
<p>如果调试器绑定到公网 IP 或 <code>0.0.0.0</code>，那么连接主机的所有客户端，都可以随意执行代码。此时，最好配备防火墙等安全措施。</p>
<h2 id="调试器客户端">调试器客户端</h2>
<h3 id="node-inspect">node-inspect</h3>
<p><code>node-inspect</code> 是 Node.js 基金会支持的命令行调试器，它使用 Inspector 协议。</p>
<p>它随 Node.js 捆绑发行，可以通过命令 <code>node inspect myscript.js</code> 启用。</p>
<p>也可以安装最新的独立版本。比如 <code>npm install -g node-inspect</code>，使用时运行 <code>node-inspect myscript.js</code></p>
<h3 id="谷歌开发者工具-55微软-edge-浏览器">谷歌开发者工具 55+，微软 Edge 浏览器</h3>
<p>选项一：打开谷歌浏览器的 <code>chrome://inspect</code> 或 Edge 浏览器的 <code>edge://inspect</code>。点击配置按钮，确保目标主机和端口号在列表中。</p>
<p>选项二：将 <code>/json/list</code> 输出结果的 <code>devtoolsFrontendUrl</code> 或 <code>--inspect</code> 输出的提示文本拷贝至地址栏</p>
<h3 id="visual-studio-code-110">Visual Studio Code 1.10+</h3>
<p>在调试面板，点击 settings 图标，打开 <code>.vscode/launch.json</code>。选择 &ldquo;Node.js&rdquo; 初始化启动。</p>
<h2 id="命令行选项">命令行选项</h2>
<ul>
<li><code>--inspect</code> 开启调试器代理；监听默认地址和端口号（127.0.0.1:9229）</li>
<li><code>--inspect=[host:port]</code> 同上，但可以修改默认地址和端口号</li>
<li><code>--inspect-brk</code> 同 <code>--inspect</code>，且在代码执行前停止运行</li>
<li><code>--inspect-brk=[host:port]</code> 略</li>
<li><code>node inspect script.js</code> 产生子进程运行用户脚本，开启 <code>--inspect</code> 选项；主进程运行命令行调试器</li>
<li><code>node inspect --port=xxxx script.js</code> 略</li>
</ul>
<h2 id="参考资料">参考资料</h2>
<ol>
<li><a href="https://nodejs.org/en/docs/guides/debugging-getting-started/" title="Debugging Guide">Debugging Guide</a> - nodejs.org</li>
</ol>
<a href="https://gitee.com/liuz2/liuz2/blob/master/content/posts/debug-nodejs.md#tree_comm_title" class="no-underline db b--black pa2 tc bg-black-90" style="color:#eee;">进入留言</a><ul class="pa0">
  
   <li class="list dib">
     <a href="/tags/node" class="link f5 grow no-underline br-pill ba ph3 pv2 mb2 dib black sans-serif">node</a>
   </li>
  
</ul>
<div class="mt6 instapaper_ignoref">
      
      
      </div>
    </div>

    <aside class="w-30-l mt6-l">




</aside>

  </article>

    </main>
    <footer class="bg-black bottom-0 w-100 pa3" role="contentinfo">
  <div class="flex justify-between">
  <a class="f4 fw4 hover-white no-underline white-70 dn dib-ns pv2 ph3" href="https://liuz2.gitee.io/" >
    &copy;  liuz2's Blog 2022 
  </a>
    <div>














</div>
  </div>
</footer>

    

  <script src="/dist/js/app.3fc0f988d21662902933.js"></script>


  </body>
</html>
